use std::sync::{Arc, Mutex};
use once_cell::sync::Lazy;
use sqlx::{Pool, Sqlite};
use serde_json::Value;

// 全局消息队列
pub static GLOBAL_QUEUE: Lazy<Arc<Mutex<Vec<Value>>>> = Lazy::new(|| {
    Arc::new(Mutex::new(Vec::new()))
});

// 全局数据库连接池
pub static GLOBAL_POOL: Lazy<Arc<Pool<Sqlite>>> = Lazy::new(|| {
    Arc::new(create_db_pool().expect("Failed to create database pool"))
});

// 创建数据库连接池
fn create_db_pool() -> Result<Pool<Sqlite>, sqlx::Error> {
    // 获取可执行文件所在目录
    let exe_dir = std::env::current_exe()
        .unwrap_or_else(|_| std::path::PathBuf::from("."))
        .parent()
        .unwrap_or_else(|| std::path::Path::new("."))
        .to_path_buf();

    // 根据环境确定数据库路径
    let database_path = if cfg!(debug_assertions) {
        // 开发环境：使用项目根目录
        std::env::current_dir()
            .unwrap_or_else(|_| std::path::PathBuf::from("."))
            .join("database")
            .join("ai_trade.db")
    } else {
        // 生产环境：使用可执行文件目录
        exe_dir.join("database").join("ai_trade.db")
    };

    // 确保数据库目录存在
    if let Some(db_dir) = database_path.parent() {
        std::fs::create_dir_all(db_dir)
            .expect("Failed to create database directory");
    }

    // 构建数据库URL
    let database_url = std::env::var("DATABASE_URL").unwrap_or_else(|_| {
        format!("sqlite:{}", database_path.to_string_lossy())
    });
    
    println!("Connecting to database: {}", database_url);
    
    let pool = sqlx::sqlite::SqlitePoolOptions::new()
        .max_connections(10)
        .connect_lazy(&database_url)?;
    
    Ok(pool)
}